package edu.stanford.nlp.parser.ensemble.maltparser.core.syntaxgraph.reader;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;


import edu.stanford.nlp.parser.ensemble.maltparser.core.exception.MaltChainedException;
import edu.stanford.nlp.parser.ensemble.maltparser.core.io.dataformat.DataFormatInstance;
import edu.stanford.nlp.parser.ensemble.maltparser.core.syntaxgraph.TokenStructure;

/**
*
*
* @author Johan Hall
*/
public interface SyntaxGraphReader {
	/**
	 * Opens a file for read only
	 * 
	 * @param fileName	the file name of the file
	 * @param charsetName	the name of the character encoding set 
	 * @throws MaltChainedException
	 */
	public void open(String fileName, String charsetName) throws MaltChainedException;
	/**
	 * Opens an URL for read only
	 * 
	 * @param url the URL of the resource
	 * @param charsetName the name of the character encoding set 
	 * @throws MaltChainedException
	 */
	public void open(URL url, String charsetName) throws MaltChainedException;
	/**
	 * Opens an input stream
	 * 
	 * @param is an input stream
	 * @param charsetName the name of the character encoding set 
	 * @throws MaltChainedException
	 */
	public void open(InputStream is, String charsetName) throws MaltChainedException;
	/**
	 * Opens an input stream reader
	 * 
	 * @param isr an input stream reader
	 * @throws MaltChainedException
	 */
	public void open(InputStreamReader isr) throws MaltChainedException;
	/**
	 * Cause the syntax graph reader to read the beginning of the file (such as header information)
	 * 
	 * @throws MaltChainedException
	 */
	public void readProlog() throws MaltChainedException;
	
	/**
	 * Reads a sentence (token structure, dependency structure or/and phrase structure)
	 * 
	 * @param syntaxGraph a syntax graph (token structure, dependency structure or/and phrase structure)
	 * @return true if there is more sentences to be processed, otherwise false.
	 * @throws MaltChainedException
	 */
	public boolean readSentence(TokenStructure syntaxGraph) throws MaltChainedException;
	/**
	 * Reads the end of the file, after all sentences have been processed, 
	 * 
	 * @throws MaltChainedException
	 */
	public void readEpilog() throws MaltChainedException;
	/**
	 * Returns the current number of the sentence.
	 * 
	 * @return the current number of the sentence.
	 * @throws MaltChainedException
	 */
	public int getSentenceCount() throws MaltChainedException;
	/**
	 * Returns the input data format instance
	 * 
	 * @return the input data format instance
	 */
	public DataFormatInstance getDataFormatInstance();
	/**
	 * Sets the input data format instance
	 * 
	 * @param dataFormatInstance an input data format instance
	 */
	public void setDataFormatInstance(DataFormatInstance dataFormatInstance);
	/**
	 * Returns a string representation of the reader specific options.
	 * 
	 * @return a string representation of the reader specific options.
	 */
	public String getOptions();
	/**
	 * Sets the reader specific options.
	 * 
	 * @param optionString a string representation of the reader specific options
	 * @throws MaltChainedException
	 */
	public void setOptions(String optionString) throws MaltChainedException;
	/**
	 * Closes the file or the input stream.
	 * 
	 * @throws MaltChainedException
	 */
	public void close() throws MaltChainedException;
	
	public int getNIterations();
	public void setNIterations(int iterations);
	public int getIterationCounter();
}
